/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tramite.bc;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.general.be.Area;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.tramite.be.DocumentoIncluido;
import org.cip.esymons.tramite.be.EnumEstadoOperacion;
import org.cip.esymons.tramite.be.Operacion;
import org.cip.esymons.tramite.be.Transaccion;

/**
 *
 * @author ChristianATE
 */
@Stateless
public class DocumentoIncluidoFacade implements DocumentoIncluidoFacadeLocal {

    @PersistenceContext
    private EntityManager em;

    public void create(DocumentoIncluido documentoIncluido) {
        em.persist(documentoIncluido);
    }

    public void edit(DocumentoIncluido documentoIncluido) {
        em.merge(documentoIncluido);
    }

    public void remove(DocumentoIncluido documentoIncluido) {
        em.remove(em.merge(documentoIncluido));
    }

    public DocumentoIncluido find(Object id) {
        return em.find(DocumentoIncluido.class, id);
    }

    public List<DocumentoIncluido> findAll() {
        return em.createQuery("select object(o) from DocumentoIncluido as o").getResultList();
    }

    public List<DocumentoIncluido> listarDocExterXEmpleado(Empleado empl) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o inner Join o.fkTraCodigo t inner Join o.fkResCodigo r ");
            sb.append(" where o.opeEstado<>?3 and r=?1 and t.fkTrmCodigo.trmNombre=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, empl);
            q.setParameter(2, "Documento Externo");
            q.setParameter(3, EnumEstadoOperacion.archivado);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarDocumentosExpor(Date ini, Date fin, EnumEstadoOperacion estado, Area area) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o inner Join o.fkTraCodigo t inner Join o.carCodigo ca ");
            sb.append(" where o.opeFecha >= ?1 and o.opeFecha <=?2 and t.fkTrmCodigo.trmNombre=?3");

            if (estado != null) {
                sb.append(" and o.opeEstado=?4");
                if (area != null) {
                    sb.append(" and ca.fkAreCodigo=?5");
                }
            } else if (area != null) {
                sb.append(" and ca.fkAreCodigo=?4");
            }

            q = em.createQuery(sb.toString());

            Calendar fecha;
            fecha = Calendar.getInstance();
            fecha.setTime(ini);
            fecha.set(Calendar.HOUR, 23);
            fecha.set(Calendar.MINUTE, 59);
            fecha.set(Calendar.SECOND, 59);
            fecha.set(Calendar.MILLISECOND, 0);

            q.setParameter(1, fecha.getTime());

            fecha = Calendar.getInstance();
            fecha.setTime(fin);
            fecha.set(Calendar.HOUR, 23);
            fecha.set(Calendar.MINUTE, 59);
            fecha.set(Calendar.SECOND, 59);
            fecha.set(Calendar.MILLISECOND, 0);
            q.setParameter(2, fecha.getTime());

            q.setParameter(3, "Documento Administrativo");

            if (estado != null) {
                q.setParameter(4, estado);
                if (area != null) {
                    q.setParameter(5, area);
                }
            } else if (area != null) {
                q.setParameter(4, area);
            }

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarDocumentosExpor2(Date ini, Date fin, EnumEstadoOperacion estado, Area area) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d, Operacion o,  Transaccion t, Documento do, Empleado e, CargoEmpleado ce, Cargo c ");
            sb.append(" where d.fkOpeCodigo= o and o.fkTraCodigo = t and d.fkDocCodigo = do and do.fkPerCodigoemp = e and ce.empleado = e and ce.cargo = c");
            sb.append(" and o.opeFecha >= ?1 and o.opeFecha <=?2 and t.fkTrmCodigo.trmNombre=?3");

            if (estado != null) {
                sb.append(" and o.opeEstado=?4");
                if (area != null) {
                    sb.append(" and c.fkAreCodigo=?5");
                }
            } else if (area != null) {
                sb.append(" and c.fkAreCodigo=?4");
            }

            q = em.createQuery(sb.toString());

            Calendar fecha;
            fecha = Calendar.getInstance();
            fecha.setTime(ini);
            fecha.set(Calendar.HOUR, 23);
            fecha.set(Calendar.MINUTE, 59);
            fecha.set(Calendar.SECOND, 59);
            fecha.set(Calendar.MILLISECOND, 0);

            q.setParameter(1, fecha.getTime());

            fecha = Calendar.getInstance();
            fecha.setTime(fin);
            fecha.set(Calendar.HOUR, 23);
            fecha.set(Calendar.MINUTE, 59);
            fecha.set(Calendar.SECOND, 59);
            fecha.set(Calendar.MILLISECOND, 0);
            q.setParameter(2, fecha.getTime());
            
            q.setParameter(3, "Documento Administrativo");

            if (estado != null) {
                q.setParameter(4, estado);
                if (area != null) {
                    q.setParameter(5, area);
                }
            } else if (area != null) {
                q.setParameter(4, area);
            }

            if (area != null) {
                List<DocumentoIncluido> documents = new ArrayList<DocumentoIncluido>();
                List<DocumentoIncluido> docs = q.getResultList();

                for (DocumentoIncluido doc : docs) {
                    if (doc.getFkDocCodigo().getDocGlosa().startsWith(area.getAreAbrev())) {
                        documents.add(doc);
                    }
                }
                return documents;
            } else {
                return q.getResultList();
            }
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarDocumentosXEmpleado(Empleado empl) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o inner Join o.fkTraCodigo t inner Join o.fkResCodigo r ");
            sb.append(" where o.opeEstado<>?3 and r=?1 and t.fkTrmCodigo.trmNombre=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, empl);
            q.setParameter(2, "Documento Administrativo");
            q.setParameter(3, EnumEstadoOperacion.archivado);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarArchivadosXEmpleado(Empleado empl) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o inner Join o.fkTraCodigo t inner Join o.fkResCodigo r ");
            sb.append(" where o.opeEstado=?3 and r=?1 and t.fkTrmCodigo.trmNombre=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, empl);
            q.setParameter(2, "Documento Administrativo");
            q.setParameter(3, EnumEstadoOperacion.archivado);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarEnviadosXEmpleado(Empleado empl) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o inner Join o.fkTraCodigo t inner Join d.fkDocCodigo do ");
            sb.append(" where do.fkPerCodigoemp=?1 and t.fkTrmCodigo.trmNombre=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, empl);
            q.setParameter(2, "Documento Administrativo");
//            q.setParameter(3, EnumEstadoOperacion.archivado);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarXOperacion(Operacion ope) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o");
            sb.append(" where o=?1");

            q = em.createQuery(sb.toString());

            q.setParameter(1, ope);

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }

    public List<DocumentoIncluido> listarXTransaccion(Transaccion trans) {
        try {
            Query q = null;
            StringBuilder sb = new StringBuilder();
            sb.append(" select d");
            sb.append(" from DocumentoIncluido d inner Join d.fkOpeCodigo o");
            sb.append(" where o.fkTraCodigo=?1 and o.opeDescripcion=?2");

            q = em.createQuery(sb.toString());

            q.setParameter(1, trans);
            q.setParameter(2, "Inicio");

            return q.getResultList();
        } catch (Exception ex) {
            return new ArrayList();
        }
    }
}
